package com.woniu.util.utils;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;

import java.security.SecureRandom;
import java.text.ParseException;
import java.util.Base64;
import java.util.Map;
import java.util.UUID;

/**
 * jwt工具类
 * 1:创建jwt
 * 2.解密jwt
 */
public class JWTUtil {
    private static final int KEY_LENGTH = 32;
    private static String secretKey = generateRandomKey();

    public static String getSecretKey() {
        return secretKey;
    }

    public static void setSecretKey(String newSecretKey) {
        secretKey = newSecretKey;
    }

    public static void updateSecretKey() {
        String newSecretKey = generateRandomKey();
        setSecretKey(newSecretKey);
    }

    private static String generateRandomKey() {
        byte[] key = new byte[KEY_LENGTH];
        new SecureRandom().nextBytes(key);
        return Base64.getEncoder().encodeToString(key);
    }

//    private static final String KEY = JWTUtil.generateRandomKey();
    private static final String KEY = "落霞与孤鹜齐飞,秋水共长天一色";

    /**
     * 创建jwt
     * @param map
     * @return
     * @throws JOSEException
     */
    public  static String createJWT(Map map) throws JOSEException {
        //第一部分 头部部分 主要是放一些jwt的自己描述信息，比如说是加密方式
        JWSHeader header = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();
        //第二部分 载荷部分 主要放置用户登陆成功之后的一些个人信息 （注意不能放置敏感信息）
        Payload payload = new Payload(map);
        //第三部分 签名部分 （头部+载荷部分） 通过一个密钥加密之后得到的
        JWSObject jwsObject = new JWSObject(header, payload);
        JWSSigner jwsigner = new MACSigner(KEY);
        //拿到密钥加密
        jwsObject.sign(jwsigner);
        return jwsObject.serialize();
    }

    /**
     * 解密
     * @param jwt
     * @return
     * @throws JOSEException
     * @throws ParseException
     */
    public static boolean decode(String jwt) throws JOSEException, ParseException {
        //parse()静态方法,把字符串转换成对象
        JWSObject jwsObject =JWSObject.parse(jwt);
        JWSVerifier verifier = new MACVerifier(KEY);
        //解密方法 verify()
        return jwsObject.verify(verifier);
    }
    /**
     * 通过jwt获取载荷部分用户信息
     *
     */
    public static Map getPayload(String jwt) throws ParseException {
        //parse 把字符串转成一个对象
        JWSObject jwsObject =JWSObject.parse(jwt);
        Payload payload = jwsObject.getPayload();
        Map<String, Object> map = payload.toJSONObject();
        return map;
    }


}
